package com.msmall.community.common.service;

import java.util.List;

import com.msmall.base.service.BaseManager;
import com.msmall.community.common.model.City;

public interface CityManager extends BaseManager<City, String>{

	/**
	 * 直辖市行政区划码，用,分割
	 */
	public static final String DIRECT_CITY_CODE = "110000,120000,310000,500000";
	/**
	 * 获得所有最高级别的区域信息，直辖市和省
	 * @return
	 */
	public List<City> getTopCities() throws Exception;
	/**
	 * 获得同一个父级别下的所有子级别
	 * 例如：code=浦东新区；返回上海的所有区
	 * @return
	 */
	public List<City> getSameParentCities(String code) throws Exception;

	/**
	 * 通过区划码获得直接子级的所有城市
	 * 需要判断当前区域所在级别， 1级获得2级， 2级获得3级， 如果是直辖市直接由1级获得3级
	 * @param code 110000
	 * @return
	 * @throws Exception
	 */
	public List<City> getChildCities(String code) throws Exception;
	/**
	 * 通过区划码获得直接子级的所有城市
	 * 需要判断当前区域所在级别， 1级获得2级， 2级获得3级， 如果是直辖市直接由1级获得3级
	 * 作为天气使用，如果数据库没有weather_code 值，则过滤掉
	 * @param code 110000
	 * @return
	 * @throws Exception
	 */
	public List<City> getWeatherChildCities(String code) throws Exception;
	/**
	 * 通过区划码获得。例如110000获得北京记录
	 * @param code
	 * @return
	 * @throws Exception
	 */
	public City getCityByCode(String code) throws Exception;
	/**
	 * 通过中文名称获得,例如：北京;河北;没有等级名称
	 * @param name
	 * @throws Exception 
	 */
	public City getCityByName(String name) throws Exception;
	/**
	 * 通过汉语拼音获得,例如:beijing
	 * @param code
	 * @throws Exception 
	 */
	public City getCityByEnglishName(String name) throws Exception;
	
	/**
	 * 通过天气的拼音查询,例如:beijing
	 */
	public City getCityByWeatherCode(String code) throws Exception;
	
	/**
	 * 通过行政区划码获得此地区的级别， 共三级别；
	 * 后四位都为0第一级别（最高级），返回1；
	 * 后2位为0，第二级别，返回2
	 * 否则，第三级别，返回3
	 * @param code
	 * @return
	 */
	public int getLevel(String code) throws Exception;
	
	/**
	 * 获得上一级别的CODE 
	 * EG：360802获得 360800； 360800获得360000
	 * @param code
	 * @return
	 * @throws Exception
	 */
	public String getUpCode(String code) throws Exception;
	
	/**
	 * 获得上一级别的区域
	 * EG：360802获得 360800； 360800获得360000
	 * 如果是直辖市需要由level=3，直接获得level=1的城市；110101获得110000
	 * @param code
	 * @return
	 * @throws Exception
	 */
	public City getUpCity(String code) throws Exception;
	
	/**
	 * 判断是不是有效的地区区域码
	 * @param code
	 * @return
	 */
	public boolean isCode(String code);
	/**
	 * 判断是不是直辖市
	 */
	public boolean isDirect(String code);
}
